// 商品路由表

// 加载模块
const express = require('express');
const goodsModel = require('../db/models/goodsModel');
// 可以在当前路由表中使用goodsModel来操作goods数据集合
const path = require('path');

// 创建一张路由表（空表）
const router = express.Router();

// 向路由表添加内容:

// multer插件用于接收FormData数据
// 1.安装插件：
// npm i multer
// 2.加载模块
const multer = require('multer');

// 上传单个文件（高级版）
// 3.创建upload接收器（用于接收文件的对象）
const upload = multer({
    // 文件大小
    limits: {
        // 限制上传的图片最大为400kb
        fileSize: 1024*400
    },
    // 文件过滤
    fileFilter: function (req,file,cb){
        // cb 是否接收文件的回调函数
        // 限制只能上传图片
        let reg = /\.(png|jpe?g|gif|svg|webp)$/;
        if (reg.test(file.originalname)) {
            // 接收文件
            cb(null,true);
        } else {
            // 绝收文件
            cb(null,false);
        }
    },
    // 设置文件存储位置和名称
    storage: multer.diskStorage({
        // 设置文件存储的位置
        destination: function (req,file,cb){
            // cb 用于设置上传文件存储位置的回调函数
            cb(null,'./www/uploads');
        },
        // 设置文件名称
        filename: function (req,file,cb){
            // cb 用于设置上传文件名称的回调函数 
            // cb(null,'hehe.jpg');
            // 上传的文件：1.文件名称唯一性；2.文件后缀和原来的一致。
            let fn = 'upload_'+Date.now()+'_'+parseInt(Math.random()*100000);
            let hz = path.extname(file.originalname);
            cb(null,fn+hz);
        },
    })
});
// upload.single(input的name名称)方法，用于接收单个文件
let uploadFun = upload.single('upfile');

// 上传文件接口
router.post('/upload',(req,res)=>{
    // 接收文件之后执行uploadFun函数
    uploadFun(req,res,(err)=>{// 接收文件之后执行的回调函数
        if (err) {
            // 上传的文件大于400kb
            return res.send({"code":0,"msg":"上传的图片最大为400kb"});
        }
        if (!req.file) {
            // 上传文件的类型不符合要求
            return res.send({"code":-1,"msg":"亲，只能上传图片！"});
        }
        let imgurl = 'http://localhost:9999/static/uploads/'+req.file.filename;
        res.send({"code":1,"msg":"上传成功！",imgurl});
    });
});

// 添加商品接口
router.post('/add',(req,res)=>{
    // 接收post请求参数
    let {name,type,price,desc,count,imgurl} = req.body;

    // 空值判断
    if (!name || !type || !price || !desc || !count || !imgurl) {
        return res.send({"code":0,"msg":"商品信息不能为空！"});
    }

    // 查询数据库判断是否已添加当前商品
    goodsModel.find({name})
    .then(arr=>{
        if (arr.length > 0) {
            // 数据库已有当前商品
            res.send({"code":-1,"msg":"要添加的商品已存在！"});
            // 终止链式调用
            return new Promise(()=>{});
        } else {
            // 数据库添加一条数据
            return goodsModel.insertMany({name,type,price,desc,count,imgurl});
        }
    })
    .then(()=>{
        res.send({"code":1,"msg":"添加商品成功！"});
    })
    .catch(()=>{
        res.send({"code":-2,"msg":"添加商品失败！"});
    })
})

// 删除商品接口
router.post('/del',(req,res)=>{
    // 获取post请求参数
    let {name} = req.body;
    
    // 删除数据
    goodsModel.deleteOne({name})
    .then(()=>{
        res.send({"code":1,"msg":"删除成功"});
    })
    .catch((err)=>{
        res.send({"code":0,"msg":err});
    })
})

// 修改商品接口
router.post('/update',(req,res)=>{
    // 获取post请求参数
    let {name,type,desc,count,price,imgurl,oname} = req.body;

    // 空值判断
    if (!name || !desc || !type || !count || !price || !imgurl) {
        return res.send({"code":-1,"msg":"商品信息不能为空！"});
    }

    // 修改数据
    goodsModel.updateOne({name:oname},{$set:{name,type,desc,count,price,imgurl}})
    .then(()=>{
        res.send({"code":1,"msg":"修改成功！"});
    })
    .catch((err)=>{
        res.send({"code":0,"msg":err});
    })
})

// 分页查询商品接口
router.post('/getpage',(req,res)=>{
    // 获取post请求参数
    let {page=1,size=4} = req.body;

    let pages = 0;// 总页数
    let count = 0;// 总条数

    // 查询所有数据
    goodsModel.find()
    .then(arr=>{
        count = arr.length;
        pages = Math.ceil(count/size);

        // 查询指定页数的数据
        // find()查询所有数据
        // limit(4)限制查询4条数
        // skip(index)从index的位置开始查询
        // 查询第二页：skip(4) => skip((2-1)*size)
        // 查询第三页：skip(8) => skip((3-1)*size)
        // 查询第四页：skip(12) => skip((4-1)*size)
        // ...
        // 查询第N页：skip(x) => skip((N-1)*size)
        return goodsModel.find().limit(Number(size)).skip((page-1)*size);
    })
    .then(arr=>{
        res.send({"code":1,"msg":"查询成功",arr,pages,count});
    })
    .catch((err)=>{
        res.send({"code":0,"msg":"查询失败",err});
    })
})

// 模糊搜索接口
router.post('/search',(req,res)=>{
    // 获取post请求参数
    let {kw} = req.body;

    // 匹配关键字的正则
    let reg = new RegExp(kw);

    // 查询数据
    goodsModel.find({$or:[{name:{$regex:reg}},{type:{$regex:reg}},{count:{$regex:reg}},{price:{$regex:reg}},{desc:{$regex:reg}}]})
    .then(arr=>{
        if (arr.length === 0) {
            res.send({"code":0,"msg":"暂无数据","data":[]});
        } else {
            res.send({"code":1,"msg":"查询成功","data":arr});
        }
    })
    .catch((err)=>{
        res.send({"code":-1,"msg":err,"data":[]});
    })
})

// 模块输出路由表
module.exports = router;
